EGEsoll - сборник решений задач из ЕГЭ

Задача 7 - две кучи с условием

19 Задание

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней, не меньше одного камня в каждой. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в большую кучу любое количество камней от одного до трёх или удвоить количество камней в меньшей куче. Если кучи содержат равное количество камней, можно добавить в любую из них от одного до трёх камней, удвоение в этой ситуации запрещено.

Игра завершается в тот момент, когда количество камней в одной из куч достигает 48. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 48 или больше камней. Известно, что Петя смог выиграть первым ходом. Какое наименьшее число камней могло быть суммарно в двух кучах?

20 Задание

В игре, описанной в задании 19, в начальный момент в первой куче было 13 камней, а во второй  — S камней, 1 ≤ S ≤ 47.

Укажите минимальное и максимальное из таких значений S, при которых Петя не может выиграть первым ходом, но у Пети есть выигрышная стратегия, позволяющая ему выиграть вторым ходом при любой игре Вани.

В ответе запишите сначала минимальное значение, затем максимальное.

21 Задание

В игре, описанной в задании 19, в начальный момент в первой куче было 39 камней, а во второй  — S камней, 1 ≤ S ≤ 47.

Найдите такое значение S, при котором у Вани есть стратегия, позволяющая ему выиграть вторым ходом при любой игре Пети, но у Вани нет стратегии, которая позволяла бы ему гарантированно выиграть первым ходом.

Добавлено: 08.05.26 13:13

Перейти к решению

Решение

Решение на Python:

def f(m, s1, s2):
    if s1 >= 48 or s2 >= 48:
        return m % 2 == 0
    if m == 0:
        return 0
    if s1 > s2:
        h = [f(m - 1, s1 + i, s2) for i in range(1, 4)] + [(f(m - 1, s1, s2 * 2))]
    if s1 < s2:
        h = [f(m - 1, s1, s2 + i) for i in range(1, 4)] + [(f(m - 1, s1 * 2, s2))]
    if s1 == s2:
        h = [f(m - 1, s1, s2 + j) for j in range(1, 4)] + [f(m-1, s1 + j, s2) for j in range(1,4)]
    return any(h) if m % 2 != 0 else all(h)

print("19:", min([s1+s2 for s1 in range(1, 48) for s2 in range(1, 48) if f(1, s1, s2)])) # 46
print("20:", [s2 for s2 in range(1, 48) if not f(1, 13, s2) and f(3, 13, s2)]) # 26, 43
print("21:", [s2 for s2 in range(1, 48) if not f(2, 39, s2) and f(4, 39, s2)]) # 20

Ответы:

19: 46

20: 26 43

21: 20

Автор - rubygem17

Объяснение

None

Назад